'''
Created on 2017年6月27日

@author: Administrator
'''

'''
各种内置方法（BIF）：
    1、fromkeys():用于创建并返回一个新的字典，两个参数：第一个参数是字典的键，第二个参数可选
    ，是传入键对应的值，如果不提供默认是None

'''
print("**********测试fromKey方法***************")
dict={}
dict1=dict.fromkeys(("1","2","3"))
print(dict1)
dict2=dict.fromkeys((1,2,3),"Number")
print(dict2)
dict3=dict.fromkeys((1,2,3),("one","two","three"))
print(dict3)
'''
framework会把（one ,two,three）当做一个值
'''
'''
keys(),values(),items()

keys()用于返回字典 中的键，values()用于返回字典中所有的值，那么 items()返回字典中所有的键值对
'''
print("**********************测试keys values items**************************")
dict4={}
dict5=dict4.fromkeys(range(31),"赞")
print("输出key为:",dict5.keys())
print("输出values为",dict5.values())
print("输出items为：",dict5.items())
'''
get() 参数为key值 当key不存在 get()方法不会报错 只是返回一个none 
如果希望找不到数据时返回指定的值，那么可以在第二个参数 设置对应默认返回值 
如果判断一个键是否在字典中，那么可以使用成员资格操作符（in  or not in） 来判断
clear():清空一个字典
!注意：尽量少使用变量名赋值为一个空字典的方法来清空字典，这样做存在一个弊端
      
'''
print("********************测试get clear 和clear的区别**************")
print(dict5.get(31))
print(dict5.get(31,"没有就是没有！"))
dict6=dict5.clear()
print(dict5,dict6)

a={"我":"crazyprogrammer"}
b=a
print("原来的a",a)
print("原来的b",b)
a={}
print("之后的a",a)
print("之后 的b",b)
'''
原来的字典并没有清空只是a指向一个空的字典来达到清空的效果时，存在安全隐患（账户和密码等资料有可能被窃取）
用clear则会彻底删除
'''
'''
copy() 复制一个新的字典
pop() 是给定键弹出对应的
popitem() 弹出一个项（随机）
setdefault() 和get()方法有点类似，但是setdefault()在字典中找不到相应的键时会自动添加
update() 更新字典
'''
print("******************测试copy pop popitem setdefault update******************")
dict6={'a':1,'b':2,'c':3,'d':4}
dict7=dict6.copy()
print("拷贝 dict6",dict7) 
print("测试pop()按照键弹出元素",dict7.pop('a'))
print("pop弹出后的字典为",dict7)

print("测试 popitem随即弹出项",dict7.popitem())
print("popitem弹出后的栈为",dict7)
pet={"米奇":"老鼠","汤姆":"猫","杰瑞":"老鼠","小白":"猪"}
print("原来的pet",pet)
another={"阿祥":"翔"}
pet.update(another)
print("更新后的pet",pet)
'''
直接赋值和 copy 的区别：
dict1 =  {'user':'runoob','num':[1,2,3]}
 
dict2 = dict1          # 浅拷贝: 引用对象
dict3 = dict1.copy()   # 浅拷贝：深拷贝父对象（一级目录），子对象（二级目录）不拷贝，还是引用
 
# 修改 data 数据
dict1['user']='root'
dict1['num'].remove(1)
 

print(dict1)
print(dict2)
print(dict3)
# 输出结果

{'num': [2, 3], 'user': 'root'}
{'num': [2, 3], 'user': 'root'}
{'num': [2, 3], 'user': 'runoob'}
实例中 dict2 其实是 dict1 的引用（别名），所以输出结果都是一致的，dict3 父对象进行了深拷贝，
 不会随dict1 修改而修改，子对象是浅拷贝所以随 dict1 的修改而修改。

'''
'''
字典打包（收集参数）：
两个星号的收集参数表示为将参数打包成字典形式
收集参数其实有两种打包形式：1，是以元组形式打包 2，是以字典形式打包

'''
def test(** params):
    print("有 %d个参数" %len(params))
    print("他们分别是：",params)
    
print("***********测试 打包成字典************")
test(a=1,b=2,c=3,d=4)

print("***********测试 解包************")
temp={'a':1,'b':2,'c':3,'d':4}
test(**temp)